package ch06
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;

	import utils.Ball;

	/**
	 * 摩擦力，正确的方法.
	 * 摩擦力是与速度向量相反的力，假设有一个摩擦力的数值，就可以将它从速度向量中减去。
	 * 事实上，是从速度向量的量值或速度中减去，不能只是简单地从 x,y 轴上减去。
	 * 这样做的话，如果物体沿着一定角度运动，其中的一个分速度会提前到达零，使得物体继续垂直或水平地运动一会儿，
	 * 结果看起来非常奇怪。 所以，我们要做的就是根据速度和方向找出角速度。
	 * 使用 vx 和 vy 的平方和开平方后求出速度。再使用， Math.atan2(vy, vx) 求出角度 ，
	 * 代码如下：
	 * var speed:Number = Math.sqrt(vx * vx + vy * vy); var angle:Number = Math.atan2(vy, vx);
	 * @author sjp
	 *
	 */
	public class Friction1 extends Sprite
	{
		private var ball:Ball;
		private var vx:Number=0;
		private var vy:Number=0;
		private var friction:Number=0.1;

		public function Friction1()
		{
			init();
		}

		private function init():void
		{
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;
			ball=new Ball();
			ball.x=stage.stageWidth / 2;
			ball.y=stage.stageHeight / 2;
			vx=Math.random() * 20 - 5;
			vy=Math.random() * 20 - 5;
			addChild(ball);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(event:Event):void
		{
			var speed:Number=Math.sqrt(vx * vx + vy * vy);
			var angle:Number=Math.atan2(vy, vx);
			if (speed > friction)
			{
				speed-=friction;
			}
			else
			{
				speed=0;
			}
			vx=Math.cos(angle) * speed;
			vy=Math.sin(angle) * speed;
			ball.x+=vx;
			ball.y+=vy;
		}
	}
}